--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sbapp/md2bbcode/plugins/merge_lists.py 0a28ec76f3ea7549bd103e1fa09b69267541dbb7 (0a28ec76) Text, 3.20 KB
Tff7b72from T7ee787typing Tff7b72import Te6edf3DictTb4b4b4, Te6edf3AnyTb4b4b4, Te6edf3List
Tff7b72def Td2a8ffmerge_ordered_listsTb4b4b4(Te6edf3mdTb4b4b4)Tb4b4b4:
T8b949e"""
A plugin to merge consecutive "top-level" ordered lists into one,
and also attach any intervening code blocks or blank lines to the
last list item so that the final BBCode appears as a single list
with multiple steps.
This relies on a few assumptions:
1) The only tokens between two ordered lists that should be merged
are code blocks or blank lines (not normal paragraphs).
2) We want any code block(s) right after a list item to appear in
that same bullet item.
"""
Tff7b72def Td2a8ffrewrite_tokensTb4b4b4(Te6edf3mdTb4b4b4, Te6edf3stateTb4b4b4)Tb4b4b4:
Te6edf3tokens Tff7b72= Te6edf3stateTff7b72.Td2a8fftokens
Te6edf3merged Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3i Tff7b72= T79c0ff0
Tff7b72while Te6edf3i Tff7b72< Tffa657lenTb4b4b4(Te6edf3tokensTb4b4b4)Tb4b4b4:
Te6edf3token Tff7b72= Te6edf3tokensTb4b4b4[Te6edf3iTb4b4b4]
T8b949e# Check if this token is a top-level ordered list
Tff7b72if Tb4b4b4(
Te6edf3tokenTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6fflistTa5d6ff"
Tff7b72and Te6edf3tokenTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffattrsTa5d6ff"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)Tff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fforderedTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)
Tff7b72and Te6edf3tokenTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffattrsTa5d6ff"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)Tff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffdepthTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4) Tff7b72== T79c0ff0
Tb4b4b4)Tb4b4b4:
T8b949e# Start new merged list
Te6edf3current_depth Tff7b72= Te6edf3tokenTb4b4b4[Ta5d6ff"Ta5d6ffattrsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffdepthTa5d6ff"Tb4b4b4]
Te6edf3list_items Tff7b72= Tffa657listTb4b4b4(Te6edf3tokenTb4b4b4[Ta5d6ff"Ta5d6ffchildrenTa5d6ff"Tb4b4b4]Tb4b4b4) T8b949e# bullet items in the first list
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
T8b949e# Continue until we run into something that's not:
T8b949e# another top-level ordered list,
T8b949e# or code blocks / blank lines (which we'll attach to the last bullet).
Tff7b72while Te6edf3i Tff7b72< Tffa657lenTb4b4b4(Te6edf3tokensTb4b4b4)Tb4b4b4:
Te6edf3nxt Tff7b72= Te6edf3tokensTb4b4b4[Te6edf3iTb4b4b4]
T8b949e# If there's another ordered list at the same depth, merge its bullet items
Tff7b72if Tb4b4b4(
Te6edf3nxtTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6fflistTa5d6ff"
Tff7b72and Te6edf3nxtTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffattrsTa5d6ff"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)Tff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fforderedTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)
Tff7b72and Te6edf3nxtTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffattrsTa5d6ff"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)Tff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffdepthTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4) Tff7b72== Te6edf3current_depth
Tb4b4b4)Tb4b4b4:
Te6edf3list_itemsTff7b72.Td2a8ffextendTb4b4b4(Te6edf3nxtTb4b4b4[Ta5d6ff"Ta5d6ffchildrenTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
T8b949e# If there's a code block or blank line, attach it to the *last* bullet item.
Tff7b72elif Te6edf3nxtTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffblock_codeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffblank_lineTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3list_itemsTb4b4b4: T8b949e# attach to last bullet item, if any
Te6edf3list_itemsTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffchildrenTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Te6edf3nxtTb4b4b4)
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
Tff7b72elseTb4b4b4:
T8b949e# Not a same-depth list or code block—stop merging
Tff7b72break
T8b949e# Create single merged list token
Te6edf3mergedTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fflistTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffchildrenTa5d6ff"Tb4b4b4: Te6edf3list_itemsTb4b4b4,
Ta5d6ff"Ta5d6ffattrsTa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6fforderedTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffdepthTa5d6ff"Tb4b4b4: Te6edf3current_depthTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}
Tb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# If not a top-level ordered list, just keep it as-is
Te6edf3mergedTff7b72.Td2a8ffappendTb4b4b4(Te6edf3tokenTb4b4b4)
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
T8b949e# Replace the old tokens with the merged version
Te6edf3stateTff7b72.Td2a8fftokens Tff7b72= Te6edf3merged
T8b949e# Attach to before_render_hooks so we can manipulate tokens before rendering
Te6edf3mdTff7b72.Td2a8ffbefore_render_hooksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3rewrite_tokensTb4b4b4)
Tff7b72return Te6edf3md
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────